package comp
{
	use namespace comp_layout;

	import comp.Interface.IDispose;
	
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.events.Event;

	/**
	 *<h1>列表容器基类</h1>
	 * 显示与数据的分离，提供列表的常用操作	 
	 *  1得到选择的项与值，设置选择的项与值，支持多选,lastSelected
	 * </br>
	 * 
	 * 示例:comp.TabBar,comp.Accordion</br> webgame.missionDaily.QuestItem </br>webgame.shop.ShopView 146行
	 * author:pu
	 * Date:2010.9.6
	 */
	public class ListBase extends UIComponent
	{
		include "style/MarginStyles"//外边距离
		
		public function ListBase()
		{
			super();
		}
		
		override protected function merge():void
		{
			if(this._autoW)
				this._myWidth=spriteHeight;
			
			if(this._autoH)
				this._myHeight=spriteWidth;
			
			var lay:String=getStyleDefault("layout","horizontal");//getStyle("layout");
			var ml:Number=getStyle("marginLeft");
			var mr:Number=getStyle("marginRight");
			var mt:Number=getStyle("marginTop");
			var mb:Number=getStyle("marginBottom");
			var lx:Number=0,ly:Number=0;//上个对像x和上个对像y
			var pl1:Number=0,pt1:Number=0;//用来判断是否是第一个位置
			var i:uint=0;
			var child:DisplayObject;
			var chidth:Number=height-this.getStyle("marginBottom");//内容宽度
			
			if(lay.toLocaleLowerCase()=="vertical") //垂直类按垂直顺序从上向下排列布局元素，在元素和围绕元素顺序的可选填充之间带有可选间隙。
			{	
				for(i=0;i<this.numChildren;i++)
				{
					child=this.getChildAt(i);
					if(child.visible==true)// ||  !(child is  ScrollBar)
					{
						child.x=ml;
						child.y=ly+mt;	
						
						ly=child.y+child.height+mb;
					}
				}
			}else
			{
				for(i=0;i<this.numChildren;i++)
				{
					child=this.getChildAt(i);
					if(child.visible==true)// || !(child is ScrollBar)
					{
						
						child.x=lx+ml;
						child.y=mt;	
						
						lx=child.x+child.width+mr;
						
					}
				}//end for
				
			}
		
		}
		
		
		//**************************** 属性 ******************************
		
		/**
		 * 布局方式 布局方式 Horizontal 水平(默认),Vertical垂直
		 */
		public function get layout():String
		{
			return _layout;
		}
		
		/**
		 * 布局方式 Horizontal 水平(默认),Vertical垂直,Accordion(tabBar专用)
		 */
		public function set layout(value:String):void
		{
			_layout = value;
		}
		
		/**
		 * 当前列表选中的所有项
		 */
		public function get selectedIndexs():Array
		{
			return _selectedIndexs;
		}

		/**
		 * 设置选择的索引
		 */
		public function set selectedIndexs(value:Array):void
		{
			_selectedIndexs = value;
		}

		public function get onItemBind():Function
		{
			return _onItemBind;
		}

		/**
		 * 
		 * 当绑定事件发生的时候调用的function
		 * 结构必须为:
		 * function itemBind(i:uint,dataItem:*):DisplayObject
		 */
		public function set onItemBind(value:Function):void
		{
			_onItemBind = value;
		}

		/**
		 * 得到选择项的项
		 */
		public function get selectedItem():Object
		{
			if(this.numChildren>this.selectedIndex && this.selectedIndex>=0)
				return this.getChildByName(getName(selectedIndex));
			else
				return null;
		}		
		
		/**
		 * 得到选择的所有项
		 */
		public function get selectedItems():Array
		{
			var j:uint=0;
			var obj:Object;
			var result:Array=new Array;
			for(var i:* in this.selectedIndexs)
			{
				 j=selectedIndexs[i];
				 obj=this.getChildByName(getName(j));
				 if(obj)
					 result.push(obj);
			}
			
			return result;
		}	
		
		/**
		 * 得到选择的所有值
		 */
		public function get selectedValues():Array
		{
			var j:uint=0;
			var obj:Object;
			var result:Array=new Array;
			if(data==null)
				return result;
			for(var i:* in this.selectedIndexs)
			{
				j=selectedIndexs[i];
				if(j<data.length)
				{
					obj=this.data[j];
					result.push(obj);
				}
			}
			
			return result;
		}	
		
		/**
		 * 上次选中的单项
		 */
		public function get lastSelectedItem():Object
		{
			if(this.numChildren>this.lastSelected && this.lastSelected>=0)
				return this.getChildByName(getName(lastSelected));
			else
				return null;
		}
		
		/**
		 * 得到选择的值
		 */
		public function get selectedValue():Object
		{
			if(this.data.length>this.selectedIndex && this.selectedIndex>=0)
				return this.data[this.selectedIndex];
			else
				return null;
		}
		
		/**
		 * 设置选择的值
		 */
		public function set selectedValue(value:Object):void
		{
			var i:int=findSelectedIndex(value);
			this.selectedIndex=i;
			this.selectedChange();
		}
		
		/**
		 * 上次选中的索引
		 */
		public function get lastSelected():int
		{
			return _lastSelected;
		}
		
		public function set lastSelected(value:int):void
		{
			_lastSelected = value;
		}
		
		/**
		 * 当前选中的索引
		 */
		public function get selectedIndex():int
		{
			return _selectedIndex;
		}
		
		public function set selectedIndex(value:int):void
		{
			this._lastSelected=_selectedIndex;
			_selectedIndex = value;
			this.selectedChange();
		}
		
		/**
		 * 源数据用于显示的数据
		 */
		public function get data():Array
		{
			return _data;
		}
		
		/**
		 * 设置数据源
		 */
		public function set data(value:Array):void
		{
			_data = value;
			if(parent!=null)
			{
				initialized=false;
				initialize();
			}
		}
		
		/**
		 * 显示的字段
		 */
		public function get showField():Object
		{
			return _showField;
		}
		
		public override function dispose():void
		{
			super.dispose();
			_data=null;
			removeAllChild();
		}
		
		/**
		 * 设置显示字段
		 */
		public function set showField(value:Object):void
		{
			_showField = value;
		}
		
		/**
		 * 选择项发生改变时调用的方法
		 */
		public function get onChange():Function
		{
			return _onChange;
		}
		
		/**
		 * 当选择项发生改变时调用的function
		 * 格式
		 * function onSelectedChange(listBase:ListBase):void{}
		 */
		public function set onChange(value:Function):void
		{
			_onChange = value;
		}
		
		//protected	
		override	protected function createChildren():void
		{
			removeAllChild();
			
			if(this._data==null)
				return;
			
			var itda:*;
			for(var i:uint=0;i<_data.length;i++)
			{
				if(onItemBind==null)
					return;
				itda=_data[i];
				var d:DisplayObject=onItemBind(i,itda);
				if(d!=null)
				{
					d.name=getName(i);
					this.addChild(d);
					try{
					if(_onItemBinded!=null)
						_onItemBinded(i,itda,d);
					
					}catch(e:*){}
				}
			}
		}

		
		/**
		 * 当选择项改变时发生
		 */
		protected function selectedChange():void
		{
			if(_selectedIndex!=_lastSelected || _selectedIndex==-1)
			{
				if(_onChange!=null)
					_onChange(this);				
			}
		}

		/**
		 * 移除所有子对像
		 */
		public function removeAllChild():void
		{
			while(this.numChildren>0)
			{
				var dis:*=this.removeChildAt(0);
				if(dis is IDispose)
					dis.dispose();
			}
		}
		
//		override protected function calculateSize():void
//		{
//			if(this._autoW)
//				this._myWidth=spriteHeight;
//			
//			if(this._autoH)
//				this._myHeight=spriteWidth;
//
//		}
		
		protected var _onChange:Function;
//		protected var _preItemBind:Function;//绑定之前调用 格式:function(i:uint,dataItem:Object,display:DisplayObject):void;
		protected var _onItemBinded:Function;// 绑定完成添加后调用 格式:function(i:uint,dataItem:Object,display:DisplayObject):void;
		protected var _onItemBind:Function=function(i:uint,dataItem:Object):DisplayObject{return null;};
		protected var _selectedIndex:int=-1;//当前选择项
		protected var _selectedIndexs:Array=[];//多选

		/**
		 * 按值寻找选择的索引
		 */
		protected function findSelectedIndex(value:Object):int
		{
			for(var i:uint=0;i<this.data.length;i++)
			{
				if(_data[i] is String)
				{
					if(_data[i]==value)
						return i;
				}
				else 
				{
					if(this.showField==null)
					{
						if(_data[i]==value)
							return i;
					}
					if(_data[i][this.showField]==value)
						return i;
				}
			}
			return 0;
		}	
		
		/**
		 * 按索引生成显示对像名
		 */
		protected function getName(i:int):String
		{
			return this.name+"_"+i;
		}
		
		/**
		 * 按名得到索引
		 */
		public function getIndexByName(name:String):int
		{
			var s:String=name.replace(this.name+"_","");
			return int(s);
		}

		/**
		 * 绑定添加到舞台后调用
		 * function(i:uint,item:*,display:DisplayObject):void
		 */
		public function get onItemBinded():Function
		{
			return _onItemBinded;
		}
		
		/**
		 * @private
		 */
		public function set onItemBinded(value:Function):void
		{
			_onItemBinded = value;
		}
		
		
		//样式
		protected var _layout:String;//="Horizontal";//布局方式 Vertical垂直,Horizontal 水平
		private var _data:*=[];//按钮显示文本 数据源
		private var _showField:Object=null;//显示字段
		private var _lastSelected:int=-1;//上次选择项
//		private var _autoRecorde:Boolean=true;//自动记录上次点击索引
	}
}